import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeMap;

public class WordCounter {
public static void main(String[] args) {
      String text =
          "Я памятник себе воздвиг нерукотворный,\n" +
          "К нему не зарастет народная тропа,\n" +
          "Вознесся выше он главою непокорной\n" +
          "Александрийского столпа.\n" +

          "Нет, весь я не умру — душа в заветной лире\n" +
          "Мой прах переживет и тленья убежит —\n" +
          "И славен буду я, доколь в подлунном мире\n" +
          "Жив будет хоть один пиит.\n" +
    
          "Слух обо мне пойдет по всей Руси великой,\n" +
          "И назовет меня всяк сущий в ней язык,\n" +
          "И гордый внук славян, и финн, и ныне дикой\n" +
          "Тунгус, и друг степей калмык.\n" +

          "И долго буду тем любезен я народу,\n" +
          "Что чувства добрые я лирой пробуждал,\n" +
          "Что в мой жестокий век восславил я свободу\n" +
          "И милость к падшим призывал.\n" +
   
          "Веленью божию, о муза, будь послушна;\n" +
          "Обиды не страшась, не требуя венца,\n" +
          "Хвалу и клевету приемли равнодушно\n" +
          "И не оспоривай глупца.\n";

//перечесляем все знаки припинания и так далее
String delemiters = " \t\n\r\f,.!?—";
StringTokenizer tokenizer = new StringTokenizer(text, delemiters);

//проходим все слова и считаем
//TreeMap что бы слова сортировались
Map<String, Integer> words = new TreeMap<String, Integer>();
String word;
Integer count;
      while (tokenizer.hasMoreTokens()) {
           word = tokenizer.nextToken().toLowerCase();
           count = words.get(word);
           count = (count == null) ? 1 : count + 1;
           words.put(word, count);
        }

//на печать
       Set<String> keys = words.keySet();
       for (String key : keys) {
           System.out.println(key + " " + words.get(key));
        }
         
   }
}
